home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / Graphic Elements 3 / GEMisc / Grabber.c < prev    next >
Text File  |  1995-05-27  |  4KB  |  182 lines

  1. /*
  2.     Grabber.c
  3.     
  4.     Special Graphic Element to manipulate other Graphic Elements
  5.     
  6.     Copyright 1993 by Al Evans. All rights reserved.
  7.     
  8.     11/29/93
  9.     
  10.     NOTICE:
  11.     
  12.     Because it acts as a "meta-element", this grabber utilizes knowledge of the
  13.     low-level implementation details of graphic elements and sensors. 
  14.     
  15. */
  16.  
  17. #include "Grabber.h"
  18.  
  19. pascal void RenderGrabber(GrafElPtr graphic, GWorldPtr destGWorld)
  20. {
  21. #pragma unused (destGWorld)
  22.     if (graphic->slaveGrafEl)
  23.         FrameRect(&graphic->animationRect);
  24. }
  25.  
  26. void DropSelection(GEWorldPtr world, GrabberPtr grabber)
  27. {
  28.     GrafElPtr element = (GrafElPtr) grabber;
  29.     
  30.     if (element->slaveGrafEl) {
  31.         ChangedRect(world, &element->slaveGrafEl->animationRect);
  32.         element->slaveGrafEl->changeIntrvl = grabber->slaveChgIntrvl;
  33.         element->slaveGrafEl = nil;
  34.         RectZero(&element->animationRect);
  35.     }
  36. }
  37.  
  38. Boolean GetNewSelection(GEWorldPtr world, GrabberPtr grabber, Point mousePt)
  39. {
  40.     GrafElPtr    newSelection = nil;
  41.     GrafElPtr    testElement;
  42.     Rect*        testRect;
  43.     
  44.     testElement = world->drawList;
  45.     
  46.     //Find TOPMOST element which contains mousePt
  47.     while (testElement) {
  48.         testRect = &testElement->animationRect;
  49.         if ((mousePt.v > testRect->top) && (mousePt.v < testRect->bottom) &&
  50.             (mousePt.h > testRect->left) && (mousePt.h < testRect->right) &&
  51.             (testElement->drawPlane >= grabber->minPlane) &&
  52.             (testElement->drawPlane <= grabber->maxPlane))
  53.             newSelection = testElement;
  54.         testElement = testElement->nextByPlane;
  55.     }
  56.     if (newSelection) {
  57.         ((GrafElPtr) grabber)->slaveGrafEl = newSelection;
  58.         grabber->slaveChgIntrvl = newSelection->changeIntrvl;
  59.         newSelection->changeIntrvl = 0;    //Stop autochanges
  60.         ((GrafElPtr) grabber)->animationRect = newSelection->animationRect;
  61.         ChangedRect(world, &newSelection->animationRect);
  62.         return true;
  63.     }
  64.     else {
  65.     
  66.         return false;
  67.     }
  68. }
  69.  
  70. void ActivateGrabber(GEWorldPtr world, Boolean activate)
  71. {
  72.     GrabberPtr    grabber;
  73.     //SListEntryPtr    thisEntry;
  74.     
  75.     
  76.     grabber = (GrabberPtr) FindElementByID(world, grabberID);
  77.     if (grabber) {
  78.         if (activate) {
  79.             ((GrafElPtr) grabber)->slaveGrafEl = nil;
  80.             grabber->slaveChgIntrvl = 0;
  81.             AddSensorToList(world, grabberID, &world->animationRect);
  82.             ShowElement(world, grabberID, true);
  83.         }
  84.         else {
  85.             DropSelection(world, grabber);
  86.             RemoveSensorFromList(world, grabberID);
  87.             ShowElement(world, grabberID, false);
  88.         }
  89.     }
  90. }
  91.  
  92. pascal Boolean TrackGrabber(GEWorldPtr world, GrafElPtr sensor)
  93. /*
  94.     Is mousePoint inside selection?
  95.         No:  Deselect current selection
  96.              Make new selection
  97.              If new selection == nil return
  98.     While mouseDown
  99.         Drag selection
  100. */
  101. {
  102.     Point    localPt, newPt;
  103.     short    dx;
  104.     short    dy;
  105.     OSType    sensorID;
  106.     
  107.     
  108.     GetMouse(&localPt);
  109.     if (!PtInRect(localPt, &sensor->animationRect)) {
  110.         DropSelection(world, (GrabberPtr) sensor);
  111.         if (!GetNewSelection(world, (GrabberPtr) sensor, localPt))
  112.             return true;
  113.     }
  114.     dx = localPt.h - ((GrafElPtr) sensor)->animationRect.left;
  115.     dy = localPt.v - ((GrafElPtr) sensor)->animationRect.top;
  116.     sensorID = sensor->objectID;
  117.     while(StillDown()) {
  118.         GetMouse(&newPt);
  119.         if (*((long *) &localPt) != *((long *) &newPt)) {
  120.             PtrMoveElementTo(world, sensor->slaveGrafEl, newPt.h - dx, newPt.v - dy, false);
  121.             sensor->animationRect = sensor->slaveGrafEl->animationRect;
  122.             localPt = newPt;
  123.         }
  124.         DoWorldUpdate(world, false);
  125.     }
  126.     return true;
  127. }
  128.  
  129. GrafElPtr MakeGrabber(GEWorldPtr world)
  130. {
  131.     GrafElPtr    grabber;
  132.     
  133.     grabber = NewGrafElement(world, grabberID, grabberPlane, sizeof(Grabber), NoLoader, 0, 0);
  134.     if (grabber) {
  135.         grabber->copyMode = srcCopy;
  136.         grabber->flags = 0;
  137.         grabber->renderIt = RenderGrabber;
  138.         grabber->drawIt = nil;
  139.         grabber->changeIntrvl = 0;
  140.         grabber->trackingProc = TrackGrabber;
  141.         grabber->actionProc = nil;
  142.         ((GrabberPtr) grabber)->slaveChgIntrvl = 0;
  143.         ((GrabberPtr) grabber)->minPlane = 2;
  144.         ((GrabberPtr) grabber)->maxPlane = 32766;
  145.         
  146.         
  147.     }
  148.     return grabber;
  149.     
  150. }
  151.  
  152. Boolean GrabberActive(GEWorldPtr world)
  153. {
  154.     GrafElPtr    grabber;
  155.     grabber = FindElementByID(world, grabberID);
  156.     if    (grabber)
  157.         return (grabber->flags & geShown);
  158.     else
  159.         return false;
  160. }
  161.  
  162. void SetGrabberDepth(GEWorldPtr world, short newMinPlane, short newMaxPlane)
  163. {
  164.     GrabberPtr    grabber;
  165.     grabber = (GrabberPtr) FindElementByID(world, grabberID);
  166.     if (grabber) {
  167.         grabber->minPlane = newMinPlane;
  168.         grabber->maxPlane = newMaxPlane;
  169.     }
  170. }
  171.  
  172. GrafElPtr  CurrentGrabberSelection(GEWorldPtr world)
  173. {
  174.     GrafElPtr    grabber;
  175.     
  176.     grabber = FindElementByID(world, grabberID);
  177.     if (grabber)
  178.         return grabber->slaveGrafEl;
  179.     else
  180.         return nil;
  181. }
  182.